Warning: mkdir(): No space left on device in /var/www/tg-me/post.php on line 37

Warning: file_put_contents(aCache/aDaily/post/progbook/--): Failed to open stream: No such file or directory in /var/www/tg-me/post.php on line 50
Книги для программистов | Telegram Webview: progbook/9885 -
Telegram Group & Telegram Channel
🎮 Поиск в сбалансированном дереве — AVL Tree

Проблема:
при работе с большими наборами данных обычное бинарное дерево поиска (BST) может деградировать в линейную структуру, что снижает скорость поиска до O(n).

Решение: В книге Algorithms and Data Structures for OOP With C# автор предлагает использовать AVL-дерево — сбалансированное дерево, которое поддерживает балансировку после каждой операции вставки или удаления. Это гарантирует сложность поиска, вставки и удаления за O(log n).

Пример кода:
public class AVLNode
{
public int Key;
public AVLNode Left, Right;
public int Height;

public AVLNode(int key)
{
Key = key;
Height = 1;
}
}

public class AVLTree
{
private AVLNode root;

int Height(AVLNode node) => node?.Height ?? 0;

int BalanceFactor(AVLNode node) => Height(node.Left) - Height(node.Right);

AVLNode RightRotate(AVLNode y)
{
var x = y.Left;
var T2 = x.Right;

x.Right = y;
y.Left = T2;

y.Height = Math.Max(Height(y.Left), Height(y.Right)) + 1;
x.Height = Math.Max(Height(x.Left), Height(x.Right)) + 1;

return x;
}

AVLNode LeftRotate(AVLNode x)
{
var y = x.Right;
var T2 = y.Left;

y.Left = x;
x.Right = T2;

x.Height = Math.Max(Height(x.Left), Height(x.Right)) + 1;
y.Height = Math.Max(Height(y.Left), Height(y.Right)) + 1;

return y;
}

public AVLNode Insert(AVLNode node, int key)
{
if (node == null)
return new AVLNode(key);

if (key < node.Key)
node.Left = Insert(node.Left, key);
else if (key > node.Key)
node.Right = Insert(node.Right, key);
else
return node;

node.Height = 1 + Math.Max(Height(node.Left), Height(node.Right));

int balance = BalanceFactor(node);

if (balance > 1 && key < node.Left.Key)
return RightRotate(node);

if (balance < -1 && key > node.Right.Key)
return LeftRotate(node);

if (balance > 1 && key > node.Left.Key)
{
node.Left = LeftRotate(node.Left);
return RightRotate(node);
}

if (balance < -1 && key < node.Right.Key)
{
node.Right = RightRotate(node.Right);
return LeftRotate(node);
}

return node;
}
}


Преимущества:
— Обеспечение сбалансированного дерева с высотой O(log n)
— Быстрый поиск и обновление данных
— Подходит для систем, требующих высокопроизводительных операций поиска

🐸 Книги для программистов
Please open Telegram to view this post
VIEW IN TELEGRAM



tg-me.com/progbook/9885
Create:
Last Update:

🎮 Поиск в сбалансированном дереве — AVL Tree

Проблема:
при работе с большими наборами данных обычное бинарное дерево поиска (BST) может деградировать в линейную структуру, что снижает скорость поиска до O(n).

Решение: В книге Algorithms and Data Structures for OOP With C# автор предлагает использовать AVL-дерево — сбалансированное дерево, которое поддерживает балансировку после каждой операции вставки или удаления. Это гарантирует сложность поиска, вставки и удаления за O(log n).

Пример кода:

public class AVLNode
{
public int Key;
public AVLNode Left, Right;
public int Height;

public AVLNode(int key)
{
Key = key;
Height = 1;
}
}

public class AVLTree
{
private AVLNode root;

int Height(AVLNode node) => node?.Height ?? 0;

int BalanceFactor(AVLNode node) => Height(node.Left) - Height(node.Right);

AVLNode RightRotate(AVLNode y)
{
var x = y.Left;
var T2 = x.Right;

x.Right = y;
y.Left = T2;

y.Height = Math.Max(Height(y.Left), Height(y.Right)) + 1;
x.Height = Math.Max(Height(x.Left), Height(x.Right)) + 1;

return x;
}

AVLNode LeftRotate(AVLNode x)
{
var y = x.Right;
var T2 = y.Left;

y.Left = x;
x.Right = T2;

x.Height = Math.Max(Height(x.Left), Height(x.Right)) + 1;
y.Height = Math.Max(Height(y.Left), Height(y.Right)) + 1;

return y;
}

public AVLNode Insert(AVLNode node, int key)
{
if (node == null)
return new AVLNode(key);

if (key < node.Key)
node.Left = Insert(node.Left, key);
else if (key > node.Key)
node.Right = Insert(node.Right, key);
else
return node;

node.Height = 1 + Math.Max(Height(node.Left), Height(node.Right));

int balance = BalanceFactor(node);

if (balance > 1 && key < node.Left.Key)
return RightRotate(node);

if (balance < -1 && key > node.Right.Key)
return LeftRotate(node);

if (balance > 1 && key > node.Left.Key)
{
node.Left = LeftRotate(node.Left);
return RightRotate(node);
}

if (balance < -1 && key < node.Right.Key)
{
node.Right = RightRotate(node.Right);
return LeftRotate(node);
}

return node;
}
}


Преимущества:
— Обеспечение сбалансированного дерева с высотой O(log n)
— Быстрый поиск и обновление данных
— Подходит для систем, требующих высокопроизводительных операций поиска

🐸 Книги для программистов

BY Книги для программистов


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/progbook/9885

View MORE
Open in Telegram


Книги для программистов Telegram | DID YOU KNOW?

Date: |

Importantly, that investor viewpoint is not new. It cycles in when conditions are right (and vice versa). It also brings the ineffective warnings of an overpriced market with it.Looking toward a good 2022 stock market, there is no apparent reason to expect these issues to change.

Telegram announces Anonymous Admins

The cloud-based messaging platform is also adding Anonymous Group Admins feature. As per Telegram, this feature is being introduced for safer protests. As per the Telegram blog post, users can “Toggle Remain Anonymous in Admin rights to enable Batman mode. The anonymized admin will be hidden in the list of group members, and their messages in the chat will be signed with the group name, similar to channel posts.”

Книги для программистов from us


Telegram Книги для программистов
FROM USA